# http://composingprograms.com/pages/16-higher-order-functions.html#defining-functions-iii-nested-definitions
# 对函数的抽象
# 1. 参数:函数作为参数
# 2. 内部:函数作为方法被调用
# 3. 内部:函数内部定义函数
# 4. 返回:函数作为返回值
# 5. 内部 + 返回:柯里化   f(x, y) -> g(x)(y)
# 6. 参数 + 内部 + 返回: 装饰器 

# 装饰器
def trace(fn):
    def wrapper(x):
        print("-", fn, f"({x})")
        return fn(x)
    return wrapper

@trace
def triple(x):
    return 3*x

print(triple(10))


# 柯里化  f(x,y) -> g(x)(y)
def mypow(x):
    def g(y):
        return pow(x, y)
    return g

print(mypow(2)(3))